/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.sorbonne.inf1.tp3.model.local;

import fr.sorbonne.inf1.tp3.model.exception.AnnuiteApplicationException;
import fr.sorbonne.inf1.tp3.model.exception.CalculAnnuiteApplicationException;
import fr.sorbonne.inf1.tp3.model.exception.MontantApplicationException;
import fr.sorbonne.inf1.tp3.model.exception.NbAnneesApplicationException;
import fr.sorbonne.inf1.tp3.model.exception.TauxApplicationException;

/**
 * 
 * @author Dubos Romain
 * @author Oukherfellah Riad
 */
public class Pret {
    
    public final static int ANNUITES = 1;
    public final static int NBANNEES = 2;
    
    
    /**
     * Calcul de l'annuité
     * @param montant
     * @param nb_annees
     * @param taux
     * @return resultat de l'annuité
     */
    public static Double annuites(Double montant, int nb_annees, Double taux) throws MontantApplicationException, NbAnneesApplicationException, TauxApplicationException, CalculAnnuiteApplicationException {

        if(Pret.verifMontant(montant)) throw new MontantApplicationException();
        if(Pret.verifNbAnnees(nb_annees)) throw new NbAnneesApplicationException();
        if(Pret.verifTaux(taux)) throw new TauxApplicationException();
        taux = taux / 100;
        return montant * (taux / (1 - Math.pow(1 + taux, -nb_annees)));
    }

    /**
     * Calcul du nombre d'années
     * @param annuites
     * @param montant
     * @param taux
     * @return resultat du nb d'années
     * @throws Exception problème calcul du log
     */
    public static Double nbAnnees(int annuites, Double montant, Double taux) throws CalculAnnuiteApplicationException, MontantApplicationException, AnnuiteApplicationException, TauxApplicationException{
         
        if(Pret.verifMontant(montant)) throw new MontantApplicationException();
        if(Pret.verifAnnuite(annuites)) throw new AnnuiteApplicationException();
        if(Pret.verifTaux(taux)) throw new TauxApplicationException();
        
        taux = taux / 100;

        if (taux * montant > annuites) {
            throw new CalculAnnuiteApplicationException();
        }

        return -Math.log(1 - (taux * montant) / annuites) / Math.log(1 + taux);
    }

    public static boolean verifMontant(Double pMontant) {
        if (pMontant <= 0) {
            return true;
        }
        return false;
    }

    public static boolean verifTaux(Double pTaux) {
        if (pTaux <= 0) {
            return true;
        }
        return false;
    }

    public static boolean verifAnnuite(int pAnnuite) {
        if (pAnnuite <= 0) {
            return true;
        }
        return false;
    }

    public static boolean verifNbAnnees(int pNbAnnees) {
        if (pNbAnnees <= 0) {
            return true;
        }
        return false;
    }
    
}
